home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
dprint
/
dpstdlib.c
< prev
next >
Wrap
Text File
|
1994-08-11
|
6KB
|
312 lines
/*
8086|Printman/POSTCARD 汎用下請けモジュール
Copyright (c) 1993,94 Delmonta
*/
#include<stdlib.h>
#include<jctype.h>
#include"dprint.h"
/*---------------------------------------------------------------------------*/
void card_reshow(bitmap val)
{
int i;
struct POSTCARD pcard;
if (Cardnum == Cardpos)
{
pcard.zipcode[0] = -1;
for (i=0 ; i<DATANUM ; i++)
pcard.data[i][0] = '\0';
}
else
pcard = *Card[Cardpos]; /* 構造体の一括コピー */
if (val & 1)
{
printf("\033[6;33f");
if (pcard.zipcode[0]==-1) /* 郵便番号なし */
printf(" - \n");
else if (pcard.zipcode[1]==-1) /* 上3桁のみ */
printf("%03d- \n",pcard.zipcode[0]);
else /* 5桁とも指定 */
printf("%03d-%02d\n",
pcard.zipcode[0],pcard.zipcode[1]);
}
for (i=0 ; i<DATANUM ; i++)
{
if (val & (2<<i))
printf("\033[%d;33f%-24s\n",i+7,pcard.data[i]);
}
}
/*---------------------------------------------------------------------------*/
void dp_putcardnum(void)
{
printf("\033[24;62f\033[7;37m" "カード %4u/%4u" "\033[0m",
Cardpos+1,Cardnum);
}
static char Ungetch_buf[2];
static unsigned Ungetch_num;
/*---------------------------------------------------------------------------*/
void dp_ungetch(char c)
{
Ungetch_buf[Ungetch_num++] = c;
}
char dp_getch(void)
{
void exit(int);
char c;
if (Ungetch_num) /* バッファに文字がたまっているか */
return Ungetch_buf[--Ungetch_num];
rep:
c = getch();
if (c==3)
exit(EXITCODE_CTRLC);
if (c=='\033' && kbhit()) /* 特殊キーか */
return EXTKEY_H;
else if (c=='\0') /* IBM PCの特殊キーコードは0x00で */
{ /* はじまり、EXTKEY_Hと混同して誤 */
putchar('\7'); /* 動作する可能性がある */
getch();
goto rep;
}
switch (c) /* キャラクタコード変換 */
{
case '\n': c = DOWNKEY; break; /* 98→TOWNS */
case 'K'-0x40: c = UPKEY; break;
case 'L'-0x40: c = RIGHTKEY; break;
case '\x1d': c = LEFTKEY; break; /* TOWNS→98 */
/* BSを処理するため */
case 'E'-0x40: c = UPKEY; break; /* ダイヤモンドカーソル */
case 'S'-0x40: c = LEFTKEY; break;
case 'D'-0x40: c = RIGHTKEY; break;
case 'X'-0x40: c = DOWNKEY; break;
}
return c;
}
/*---------------------------------------------------------------------------*/
char dp_errmes(const char *s)
{
char c;
printf("\033[%d;1f\033[K\033[33m%s",ERRMES_LINE,s);
c = dp_getch();
if (c==EXTKEY_H) /* 特殊キーの入力を捨てる */
{
dp_getch();
}
printf("\033[37m\033[2K\n");
return c;
}
/*---------------------------------------------------------------------------*/
bool strinput(char *buf,unsigned len)
{
unsigned strlen(char *);
int _ctypebuf[80];
int *ctypebuf = _ctypebuf + 1;
unsigned l = 0; /* 入力中の文字列の長さ */
unsigned i;
char c;
_ctypebuf[0] = CT_ANK;
while ((c=*buf)!='\0')
{
putchar(c);
*ctypebuf = chkctype(c,*(ctypebuf-1));
buf++;
ctypebuf++;
l++;
}
for (i=l ; i<len ; i++)
putchar(' ');
for (i=l ; i<len ; i++)
putchar('\010');
strin_keyrep:
c = dp_getch();
if (c=='\010' && l)
{
do
{
printf("\010 \010");
l--;
buf--;
} while( *--ctypebuf==CT_KJ2 || *ctypebuf==CT_ILGL);
}
else if (c=='\r' || c=='\033')
{
*buf = '\0';
if (c=='\r')
return TRUE;
else
return FALSE;
}
else if (c>=' ' && l<len)
{
*ctypebuf = chkctype(c,*(ctypebuf-1));
if (*ctypebuf == CT_KJ1 && l==len-1)
{ /* バッファの最後に漢字の第1バイトが */
dp_getch(); /* 来た場合はその漢字全体を捨てる */
putchar('\7');
}
else
{
l++;
*buf++ = c;
ctypebuf++;
putchar(c);
}
}
else
{
if (c==EXTKEY_H) /* 特殊キーのコードは捨てる */
dp_getch();
putchar('\7');
}
goto strin_keyrep;
}
/*---------------------------------------------------------------------------*/
bool addcard(unsigned cardpos)
{
int i;
void far *farmalloc(long);
struct POSTCARD far *p;
if (cardpos>=MAXCARD)
{
dp_errmes("これ以上カードは増やせません.");
return FALSE;
}
p = (struct POSTCARD far *)farmalloc(sizeof(struct POSTCARD)) + 0L;
if (p==NULL)
{
dp_errmes("メモリ不足です.");
return FALSE;
}
Card[cardpos] = p;
p->zipcode[0] = p->zipcode[1] = -1;
for (i=0 ; i<5 ; i++)
p->data[i][0] = '\0';
return TRUE;
}
/*---------------------------------------------------------------------------*/
int dp_getval(void)
{
char buf[5];
buf[0] = '\0';
if (strinput(buf,4) && buf[0]!='\0')
{
int a = atoi(buf);
if (a<0)
a = -a;
return a;
}
else
return -1;
}
/*---------------------------------------------------------------------------*/
bool dp_getval2(fract *val)
{
unsigned strlen(char *);
fract i;
char buf[8];
getval2_rep:
buf[0] = '\0';
if (!strinput(buf,sizeof(buf)-1))
return FALSE;
else
{
i = dpatoi(buf);
if (i==DPATOI_ERROR)
{
for ( i=strlen(buf) ; i>0 ; i--)
printf("\010 \010");
goto getval2_rep;
}
}
*val = i;
return TRUE;
}
/*---------------------------------------------------------------------------*/
bool iscardexist(void)
{
if (Cardnum>0)
return TRUE;
dp_errmes("カードがありません.");
return FALSE;
}
/*---------------------------------------------------------------------------*/
void *dp_malloc(size_t len)
{
void *p = malloc(len);
if (p==NULL)
dp_errmes("メモリ不足です");
return p;
}